package cn.yx.common.core.util.awt;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>AWT字符串工具类</p>
 *
 * @author Wgssmart
 */
public final class AwtStringUtil {

    private AwtStringUtil() {
    }

    /**
     * 根据字符串内容，字符串每行限制的最大宽度和字体相关信息，获取换行后的多个字符串
     *
     * @param content     字符串内容
     * @param maxWidth    最大宽度
     * @param fontMetrics 字体信息
     * @return
     */
    public static List<String> multiRows(String content, int maxWidth, FontMetrics fontMetrics) {
        List<String> multiRows = new ArrayList<>();
        // 获取字符串内容的单行宽度
        int contentWidth = fontMetrics.stringWidth(content);
        if (contentWidth <= maxWidth) {
            multiRows.add(content);
            return multiRows;
        }
        char[] charArray = content.toCharArray();
        int lineWidth = 0;
        int charStartIndex = 0;
        int charCount = 0;
        for (char theChar : charArray) {
            int charWidth = fontMetrics.charWidth(theChar);
            lineWidth += charWidth;
            charCount++;
            if (lineWidth >= maxWidth) {
                // 如果该行宽度大于等于最大宽度了，则获取该行的字符
                multiRows.add(String.valueOf(charArray, charStartIndex, charCount));
                lineWidth = 0;
                charStartIndex += charCount;
                charCount = 0;
            }
            if (charStartIndex + charCount >= charArray.length) {
                multiRows.add(String.valueOf(charArray, charStartIndex, charCount));
            }
        }
        return multiRows;
    }

    /**
     * 获取字符串行宽
     *
     * @param text
     * @param fontMetrics
     * @return
     */
    public static int getStringLineWidth(String text, FontMetrics fontMetrics) {
        char[] charArray = text.toCharArray();
        int lineWidth = 0;
        for (char theChar : charArray) {
            int charWidth = fontMetrics.charWidth(theChar);
            lineWidth += charWidth;
        }
        return lineWidth;
    }

    /**
     * 根据行数及字体信息获取所有字符串内容的高度
     *
     * @param lines
     * @param fontMetrics
     * @return
     */
    public static int getStringLinesHeight(int lines, FontMetrics fontMetrics) {
        return lines * fontMetrics.getHeight();
    }

}
